#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
vector<int> w, h, s;
// bool a[100001];

// bool can_put(int i, int j);
int find_i(int i);
void sort(int left, int right);
bool cmp(int wl, int hl, int i);
bool can_put(int i, int j);

int main()
{
    // memset(a,false,sizeof(a));
    int n{0}, tmp1{0}, tmp2{0};
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> tmp1 >> tmp2;
        w.push_back(tmp1);
        h.push_back(tmp2);
    }
    sort(0, n-1);
    // for(int i = 0; i < n-1; i++)  // sort
    // {
    //     int min = i;
    //     for(int j = i+1; j < n; j++)
    //     {
    //         if(w[j] < w[min])
    //         {
    //             min = j;
    //         }
    //         else if(w[j] == w[min] && h[j] > h[min])
    //         {
    //             min = j;
    //         }
    //     }
    //     if(min != i)
    //     {
    //         int tmp = w[min];
    //         w[min] = w[i];
    //         w[i] = tmp;
    //         tmp = h[min];
    //         h[min] = h[i];
    //         h[i] = tmp;
    //     }
    // }
    // cout << endl << endl;
    // for(int i = 0; i < n; i++) cout << w[i] << " " << h[i] << endl;
    // s.push_back(1);  // index: 0
    // for(int i = 1; i < n; i++)
    // {
    //     s.push_back(1);  // index:1,2,...,n-1
    //     for(int j = i-1; j >= 0; j--)
    //     {
    //         if(can_put(j, i))
    //         {
    //             s[i] = max(s[i], s[j]+1);  // if can be put in
    //         }
             
    //     }
    // }
    // int len = s.size(), max{0};
    // for(int i = 0; i < n ; i++)
    // {
    //     // cout << s[i] << " ";
    //     if(max < s[i])
    //     {
    //         max = s[i];
    //     }
    // }
    // cout << max << endl;
    // for(int i = 0; i < 14; i++) cout << a[i] << endl;
    // int len = s.size();
    for(int i = 0; i < n; i++)
    {
        int index = lower_bound(s.begin(), s.end(), h[i]) - s.begin();  // 二分法害死人，也救人
        if(index == s.size()) 
        {
            s.push_back(h[i]);
            // len++;
        }
        else s[index] = h[i];

    }
    cout << s.size() << endl;
    return 0;
}


int find_i(int i) //  小于h[i]里面最大的那个的下一个
{
    int low = 0, high = s.size();
    // if(high == 0) return 0;
    int mid = (low + high) / 2;  // the place we need to find 
    while (low < high)
    {
        mid = (low + high) / 2;
        if(h[mid] < h[i])
        {
            low = mid+1;
        }
        else
        {
            high = mid;
        }
    }
    return high;
}


void sort(int left, int right)
{
    if(left >= right) return;
    
    int i = left;
    int j = right;
    int wl = w[left];
    int hl = h[left];
    while(i < j)
    {
        // cout << i << " " << j << " " << left << endl;
        while(i < j && cmp(wl, hl, j)) j--;
        w[i] = w[j];
        h[i] = h[j];

        while(i < j && !cmp(wl, hl, i)) i++;
        w[j] = w[i];
        h[j] = h[i];
    }
    // cout << 1 << endl;
    w[i] = wl;
    h[i] = hl;
    sort(left, i-1);
    sort(i+1, right);
}

bool cmp(int wl, int hl, int i)
{
    if(wl < w[i]) return true;
    if(wl > w[i]) return false;
    if(hl > h[i]) return true;
    else return false;
}

bool can_put(int i, int j)
{
    if(h[i] < h[j]) return true;
    else return false;
}